package models

import (
	"gorm.io/gorm"
	"time"
)

// 标签数据结构
type Tag struct {
	Model // 统一基础模型

	Name       string `json:"name" validate:"required,min=2,max=20" label:"标签名称"`
	CreatedBy  string `json:"created_by" validate:"required,min=2,max=20" label:"标签创建人"`
	ModifiedBy string `json:"modified_by" validate:"required,min=2,max=20" label:"标签修改人"`
	State      int    `json:"state" validate:"required,numeric,oneof=0 1" label:"标签状态"`
}

// 有人会疑惑db是哪里来的；因为在同个models包下，因此db *gorm.DB是可以直接使用的

// GetTags 分页获取标签列表
func GetTags(page int, pageSize int, whereMaps interface{}) (tags []Tag) {
	// db.Where(whereMaps).Offset(page).Limit(pageSize).Find(&tags)
	// 上面省略了Model(&Tag{}),
	db.Model(&Tag{}).Where(whereMaps).Offset(page).Limit(pageSize).Order("id desc").Find(&tags)
	return
}

// GetTagTotal 获取标签总记录数
func GetTagTotal(whereMaps interface{}) int64 {
	var count int64
	db.Model(&Tag{}).Where(whereMaps).Count(&count)

	return count
}

// ExistsTagByName 判断标签是否存在
func ExistsTagByName(name string) bool {
	var tag Tag
	db.Model(&Tag{}).Where("name=?", name).Select("id,name").First(&tag)
	if tag.ID > 0 {
		return true
	}

	return false
}

// AddTag 添加标签
func AddTag(name string, state int, createdBy string) int {
	tags := &Tag{
		Name:      name,
		State:     state,
		CreatedBy: createdBy,
	}
	db.Model(&Tag{}).Create(tags)

	return tags.ID
}

// EditTag 编辑标签
func EditTag(id int, data interface{}) bool {
	db.Model(&Tag{}).Where("id=?", id).Updates(data)
	return true
}

// DeleteTAg删除标签
func DeleteTAg(id int) bool {
	db.Where("id=?", id).Delete(&Tag{})
	return true
}

// 给CreatedOn赋值
func (tag *Tag) BeforeCreate(scope *gorm.DB) error {
	scope.Statement.SetColumn("CreatedOn", time.Now().Unix())

	return nil
}

// 给ModifiedOn 赋值
func (tag *Tag) BeforeUpdate(scope *gorm.DB) error {
	scope.Statement.SetColumn("ModifiedOn", time.Now().Unix())

	return nil
}
